import { patch } from './patch';
import Watcher from '../observer/wacher'

export function mounteComponent(vm, el){
  callHook(vm, 'beforeMounte');
  let updateComponent = () => {
    vm._update(vm._render()); // vm._render将render转化为vnode； vm_update将vnode变成node放进页面
  }
  new Watcher(vm, updateComponent, () => {
    callHook(vm, 'updated');
  }, true)
  callHook(vm, 'mounted');
}

export function lifecycleMixin(Vue){
  Vue.prototype._update = function(vnode){
    // 将虚拟dom专户为真实dom进行更新
    let vm = this;
    // 两个参数 旧dom， 虚拟dom
    // 需要区分一下是首次还是更新
    let preVnode = vm._vnode; // 如果是首次，值为null
    if (!preVnode) {
      vm.$el = patch(vm.$el, vnode);
      vm._vnode = vnode; // 保证是原来的那一次
    } else {
      patch(preVnode, vnode);
    }
  }
}
// 生命周期的调用

export function callHook(vm, hook){
  const handlers = vm.$options[hook];
  if (handlers) {
    for(let i = 0; i < handlers.length; i++) {
      handlers[i].call(vm);
    }
  }
}